/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package moteur.partie;
import Interface.ListenerJoeur;
import Interface.ListenerJoeur.EventJoeur;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import moteur.Transport;
import moteur.paquet.*;
import moteur.carte.*;

/**
 *
 * @author Administrateur
 */
public abstract class Joeur implements Jouer {

    private Vector<ListenerJoeur> listeners;
    /**
     * Les pions du joeurs.
     */
    protected PionsEnMain pions;
    /**
     * Ses cartes transport.
     */
    protected CartesEnMain cartes;
    /**
     *
     */
    protected String nom;
    /**
     * Sa position actuelle sur la carte.
     */
    protected Ville localisation;
    /**
     * Pour détermner le gagnant.
     */
    protected int score; //MAXCARTE*(nb villes traversées)+ total cartes restante
    /**
     *
     */
    protected Partie p = Partie.getInstance() ;
    private boolean aPassé;
    //private EventJeu ticket;

    /**
     *
     * @param nom
     */
    public Joeur(String nom) {
        this.nom = nom;
        this.localisation = p.getG().getVille(0) ;
        this.pions = new PionsEnMain();
        this.cartes = new CartesEnMain();
        this.aPassé = false;
        this.score = 0;
        
        //this.ticket = new EventJeu(this);
        this.listeners = new Vector<ListenerJoeur>();
    }

    /**
     *
     * @return
     */
    public CartesEnMain getCartes() {
        return cartes;
    }

    /**
     * Ajoute un listener à ce joueur.
     * @param l
     */
    public void addListener(ListenerJoeur l){
        listeners.add(l);
    }

    /**
     *
     * @param l
     */
    public void removeListener(ListenerJoeur l){
        listeners.remove(l);
    }

    /**
     *
     * @return
     */
    @Override
    public Ville getLocalisation() {
        return localisation;
    }

    /**
     *
     * @return
     */
    @Override
    public String getNom() {
        return nom;
    }

    /**
     *
     * @return
     */
    public PionsEnMain getPions() {
        return pions;
    }

    /**
     *
     * @return
     */
    @Override
    public int getScore() {
        try{
        return score + cartes.total();
        }catch(Exception e){}
        return -1;
    }

    /**
     *
     * @return
     */
    public Partie getP() {
        return p;
    }

    /**
     *
     * @param p
     */
    public void setP(Partie p) {
        this.p = p;
    }

    /**
     *
     * @return
     */
    @Override
    public boolean aPasse() {
        return aPassé;
    }

    /**
     *
     */
    @Override
    public void naPasPasse() {
        aPassé = false;
    }

    /**
     * Fait passer son tour au joeur.
     */
    @Override
    public void passe() {
        fireEventToListeners(null, null, null);
        aPassé = true;
        if (p.enPhasePioche()){
            try {
                cartes.melanger(PaquetCartesVoyages.getInstance());
                pions.melanger(PaquetPionTransport.getInstance());
            } catch (TypeMismatchException ex) {
                Logger.getLogger(Joeur.class.getName()).log(Level.SEVERE, null, ex);
            } catch (PaquetVideException ex) {
                Logger.getLogger(Joeur.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
        updatePartie();
    }

    /**
     * Fait piocher le joeur.
     */
    @Override
    public void pioche() {
        try{
            this.cartes.piocher(8, PaquetCartesVoyages.getInstance());
            this.pions.piocherCaché(PaquetPionTransport.getInstance());
            //assert !(this.cartes.total() > 12);
        }catch(Exception e){}
        //fireEventToListeners(null, null, null);
    }

    /**
     *
     * @param v
     * @param t
     * @param r
     */
    protected void fireEventToListeners(Ville v, Transport t, Road r){
        EventJoeur e = new EventJoeur(v, this, t, r);
        for(ListenerJoeur l: listeners){
            l.update(e);
        }
    }

    @Override
    public String toString() {
        return nom;
    }

    

    /**
     * 
     * @param dest
     */
    public void bouge(Ville dest){
        //TODO : dés-atrocifier ces lignes de codes.
    if(!dest.getFlag().get(p.getIndex(this))){
        dest.getFlag().set(p.getIndex(this), true);
        this.score += 100;
    }
    localisation = dest;
    }

    /**
     * Met la partie au courant du coup joué.
     */
    @Override
    public void updatePartie() {
        
         p.receiveEvent(new EventJeu(this));
        /*
         if (ticket != null){
            p.receiveEvent(ticket);
        }else{
            ticket = new EventJeu(this);
            p.receiveEvent(ticket);
        }
         //*/
    }



}
